#轮序 = 0
#单元集合 = 【】
#记录集合 = 【】
#运行状态 = 真

@坐标转序号 = @【#行，#列】｛
   #行*16+#列
｝
@序号转坐标 = @【#序号】｛
    #行 ： @转整数【#序号 除以 16】
    #列 ： #序号 模 16
    返回 【#行 #列】
｝

@最大线长 = @【#序号，#记录】｛
    #坐标 = @序号转坐标、#序号
    #行 = #坐标#0
    #列 = #坐标#1
    #线长 = 1
    ；向8个方向延伸
    ；左上向右下
    #当前线长 = 1
    当 #距离：1，#距离 小于等于 4，#距离 自加 1 ｛
        #新行：#行 - #距离
        #新列：#列 - #距离
        #新序号：@坐标转序号【#新行，#新列】
        如果 #新行 大于 -1 且 #新列 大于 -1 且 #记录集合#新序号 等于 #记录 ｛
            #当前线长 自加 1
        ｝否则 ｛
            跳出
        ｝
    ｝
    当 #距离：1，#距离 小于等于 4，#距离 自加 1 ｛
        #新行：#行 + #距离
        #新列：#列 + #距离
        #新序号：@坐标转序号【#新行，#新列】
        如果 #新行 小于 16 且 #新列 小于 16 且 #记录集合#新序号 等于 #记录 ｛
            #当前线长 自加 1
        ｝否则 ｛
            跳出
        ｝
    ｝

    如果 #当前线长 大于 #线长 ｛
        #线长 = #当前线长
    ｝
    
    ；右上向左下
    #当前线长 = 1
    当 #距离：1，#距离 小于等于 4，#距离 自加 1 ｛
        #新行：#行 - #距离
        #新列：#列 + #距离
        #新序号：@坐标转序号【#新行，#新列】
        如果 #新行 大于 -1 且 #新列 小于 16 且 #记录集合#新序号 等于 #记录 ｛
            #当前线长 自加 1
        ｝否则 ｛
            跳出
        ｝
    ｝
    当 #距离：1，#距离 小于等于 4，#距离 自加 1 ｛
        #新行：#行 + #距离
        #新列：#列 - #距离
        #新序号：@坐标转序号【#新行，#新列】
        如果 #新行 小于 16 且 #新列 大于 -1 且 #记录集合#新序号 等于 #记录 ｛
            #当前线长 自加 1
        ｝否则 ｛
            跳出
        ｝
    ｝
    
    如果 #当前线长 大于 #线长 ｛
        #线长 = #当前线长
    ｝
    ；左向右
    #当前线长 = 1
    当 #距离：1，#距离 小于等于 4，#距离 自加 1 ｛
        #新行：#行
        #新列：#列 - #距离
        #新序号：@坐标转序号【#新行，#新列】
        如果 #新列 大于 -1 且 #记录集合#新序号 等于 #记录 ｛
            #当前线长 自加 1
        ｝否则 ｛
            跳出
        ｝
    ｝
    当 #距离：1，#距离 小于等于 4，#距离 自加 1 ｛
        #新行：#行
        #新列：#列 + #距离
        #新序号：@坐标转序号【#新行，#新列】
        如果 #新列 小于 16 且 #记录集合#新序号 等于 #记录 ｛
            #当前线长 自加 1
        ｝否则 ｛
            跳出
        ｝
    ｝
    如果 #当前线长 大于 #线长 ｛
        #线长 = #当前线长
    ｝
    ；上向下
    #当前线长 = 1
    当 #距离：1，#距离 小于等于 4，#距离 自加 1 ｛
        #新行：#行 - #距离
        #新列：#列 
        #新序号：@坐标转序号【#新行，#新列】
        如果 #新行 大于 -1 且 #记录集合#新序号 等于 #记录 ｛
            #当前线长 自加 1
        ｝否则 ｛
            跳出
        ｝
    ｝
    当 #距离：1，#距离 小于等于 4，#距离 自加 1 ｛
        #新行：#行 + #距离
        #新列：#列 
        #新序号：@坐标转序号【#新行，#新列】
        如果 #新行 小于 16 且 #记录集合#新序号 等于 #记录 ｛
            #当前线长 自加 1
        ｝否则 ｛
            跳出
        ｝
    ｝
    如果 #当前线长 大于 #线长 ｛
        #线长 = #当前线长
    ｝
    
    #线长
｝

@最优解 = @【#记录】｛
    #棋位 = 0
    #最大线长 = 0
    当 #序号：0，#序号 小于 16*16，#序号 自加 1 ｛
        如果 #记录集合#序号 等于 0 ｛
            #线长：@最大线长【#序号，#记录】
            如果 #线长 大于 #最大线长 ｛
                #最大线长 = #线长
                #棋位 = #序号
            ｝
        ｝
    ｝
    返回 【#棋位，#最大线长】
｝

@最优棋位 = @【】｛
    #威胁 = @最优解【1】
    #优势 = @最优解【-1】
    如果 #威胁#1 大于 #优势#1 ｛
        返回 #威胁#0
    ｝否则｛
        返回 #优势#0
    ｝
｝

@记分 = @【】｛
    #最大分： 0
    #记录： 0
    当 #序：0，#序 小于 16*16，#序 自加 1 ｛
        如果 #记录集合#序 不等于 0 ｛
            #得分 = @最大线长【#序，#记录集合#序】
            如果 #得分 大于 #最大分 ｛
                #最大分 = #得分
                #记录 = #记录集合#序
            ｝
        ｝
    ｝
    返回 【#最大分，#记录】
｝

#窗 = @生成图形、《窗口 #宽=490，#高=520，#标题=“五子棋”，【
    《列面板 #名=“#结果面板”，#宽=160，#高=0，#背景色=“#339999”，#Z=9，【
        《标签 #名=“#结果标签” #文本=“获胜”，#前景色=“#EEEEEE”，#字号=20，#Y=10》
        《按钮 #名=“#按钮”，#文本=“重新开始”，#Y=10，#光标=“手”》
    】》
】》

当 #行：0，#行 小于 16，#行 自加 1 ｛
    当 #列：0，#列 小于 16，#列 自加 1 ｛
        #单元: 空
        #窗@加子、@生成图形、《面板  #名=“#单元”，#宽=30，#高=30，#背景色=“#FFEBCD”，#边框宽=1，#边框色=“#CCCCCC”，
           #X=#列*30，#Y=#行*30，#光标=“手”，#序=（#行*16+#列）》
        @追加【#单元集合， #单元】
        @追加【#记录集合，0】
    ｝       
｝

遍历 #单元集合 为 #单元 ｛
   #单元@鼠标按下命令 = @【】｛
        如果 （取反 #运行状态）或（#轮序 不等于 0）｛
            返回 空
        ｝
        如果 #记录集合#【#单元#序】 不等于 0 ｛
            返回 空
        ｝
       
        
        #单元@加子、@生成图形、《图片 #宽=22，#高=22，#源=“./img/hei.png”，#适应=“填充”》
        #记录集合#【#单元#序】 = 1
        #轮序 = 1
        #棋位 = @最优棋位【-1】
        #单元集合#棋位@加子、@生成图形、《图片 #宽=22，#高=22，#源=“./img/bai.png”，#适应=“填充”》
        #记录集合#棋位 = -1
        
        #盘面分 = @记分【】
        如果 #盘面分#0 大于等于 5 ｛
            如果 #盘面分#1 等于 1 ｛
                #结果标签#文本 = “黑方胜”
            ｝否则｛
                #结果标签#文本 = “白方胜”
            ｝
            #结果面板#高 = 80
        ｝
        
        #轮序 = 0
    ｝ 
｝

#按钮@命令 = @【】｛
    当 #序：0，#序 小于 16*16，#序 自加 1 ｛
        #记录集合#序 = 0
        #结果面板#高 = 0
        #单元集合#序@减子【】
        #运行状态 = 真
        #轮序 = 0
        
    ｝
｝

@显示窗口、#窗














